<?php
abstract class Model{
    protected $db;
    public function __construct() {
        $this->initDB();
    }
    //初始化数据连接类
    private function initDB(){
        $this->db=  MySQLDB::getInstance($GLOBALS['config']['database']);
    }
    //获取当前模型的表名
    private function getTable(){
            return substr(get_class($this),0,-5);
    }
    //获取表的主键
    private function getPrimaryKey($table){
            $rs=  $this->db->query("desc `{$table}`");
            while($rows=mysql_fetch_assoc($rs)) {
                            if($rows['Key']=='PRI'){
                                            return $rows['Field'];
                            }
            }
    }
    /*
     * 万能的insert语句
     * @param $data array 字段名和值组成的关联数组
     */
    public function insert($data){
            $fields=array_keys($data);		//获取数组所有的键
            $values=array_values($data);	//获取数组所有的值
            //遍历字段名称，在字段名上添加反引号。
            $fields=array_map(function($field){
                            return "`{$field}`";
            },$fields);
            $fields=implode(',',$fields);	//用逗号将数组连接成字符串
            //遍历值，在所有的值上添加单引号
            $values=array_map(function($value){
                            return "'{$value}'";
            },$values);
            $values=implode(',',$values);
            $sql="insert into `{$this->getTable()}` ($fields) values ($values)";
            if($this->db->query($sql))
                return $this->db->getInsertId();    //返回自动增长的编号
            return false;
    }
    /*
     * 万能的修改SQL
     */
    public function update($data){
            $table=$this->getTable();
            $pk=  $this->getPrimaryKey($table);
            $fields=array_keys($data);
            $index=array_search($pk,$fields);	//在数组中搜索给定的值，如果成功则返回相应的键名 
            unset($fields[$index]);		//删除主键字段
            $fields=array_map(function($field) use ($data){
                            return "`{$field}`='{$data[$field]}'";
            },$fields);
            $fields=implode(',',$fields);
            $sql="update `{$table}` set $fields where `{$pk}`={$data[$pk]}";
            return $this->db->query($sql);
    }
    /*
     * 万能的删除
     */
    public function delete($id){
            $table=$this->getTable();
            $pk=  $this->getPrimaryKey($table);
            $sql="delete from `{$table}` where `{$pk}`=$id";
            return $this->db->query($sql);
    }
    //开启事务
    public function beginTransaction(){
        $this->db->query('start transaction');
    }
    //提交事务
    public function commit(){
        $this->db->query('commit');
    }
    //回滚事务
    public function rollback(){
        $this->db->query('rollback');
    }

}
